#include "StdAfx.h"
#include "Factory.h"
#include "Integer.h"
#include "String.h"
#include "List.h"
#include "Dictionarie.h"

using namespace Torrent::Bencode;

Factory::Factory(void)
{
}

Factory::~Factory(void)
{
}

IPrimitive* Factory::create( std::istream& stream )
{
    char c((char)stream.peek());
    if (c == 'i')
    {
        //Integer
        return new Integer(stream);

    }
    else if (c == 'l')
    {
        //List
        return new List(stream);
    }
    else if (c == 'd')
    {
        //Dictionarie
        return new Dictionarie(stream);
    }
    else 
    {
        //String
        if (c >= '0' && c <= '9') 
        {
            return new String(stream);
        }
    }
    //switch (c) 
    //{
    //case 'i':
    //    s.get();
    //    s >> b.m_value;

    //    if (s.fail() || s.get() != 'e')
    //        break;

    //    b.m_type = Bencode::TYPE_VALUE;

    //    return s;

    //case 'l':
    //    s.get();

    //    b.m_list = new Bencode::List;
    //    b.m_type = Bencode::TYPE_LIST;

    //    while (s.good()) 
    //    {
    //        if (s.peek() == 'e') {
    //            s.get();
    //            return s;
    //        }

    //        Bencode::List::iterator itr = b.m_list->insert(b.m_list->end(), Bencode());

    //        s >> *itr;
    //    }

    //    break;
    //case 'd':
    //    s.get();

    //    b.m_map = new Bencode::Map;
    //    b.m_type = Bencode::TYPE_MAP;

    //    while (s.good()) 
    //    {
    //        if (s.peek() == 'e') {
    //            s.get();
    //            return s;
    //        }

    //        std::string str;

    //        if (!Bencode::read_string(s, str))
    //            break;

    //        s >> (*b.m_map)[str];
    //    }

    //    break;
    //default:
    //    if (c >= '0' && c <= '9') 
    //    {
    //        b.m_string = new std::string();
    //        b.m_type = Bencode::TYPE_STRING;

    //        if (b.read_string(s, *b.m_string))
    //            return s;
    //    }

    //    break;
    //}

    //s.setstate(std::istream::failbit);
    ////b.clear();

    //return s;

    return NULL;
}